package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingDao;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.pojo.OrderSetting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {


    @Autowired
    OrderSettingDao orderSettingDao;

    @Autowired
    MemberDao memberDao;

    @Autowired
    OrderDao orderDao;



    /**
     * 预约功能
     *  1. 判断该日期是否可以预约
     *      根据日期查询预约设置对象， 如果有预约设置对象，能预约，如果没有预约设置对象，返回错误结果
     *  2. 判断是否预约已满
     *      如果已预约人数大于等于可预约人数，预约已满，返回错误结果，否则，继续
     *  3. 判断是否是会员
     *      根据手机号码查询会员对象，如果不存在，自动注册为会员
     *      如果存在
     *          判断该会员是否重复预约: 该会员在该日期是否预约了该套餐
     *  4. 添加预约信息
     *      写入数据库
     *  5. 更新预约设置数据库: 指定日期已预约人数 加 1
     *
     *
     * @param map
     */
    @Override
    public Result addOrder(Map<String, Object> map) throws ParseException {
        //从map集合中获取预约时间
        Object orderDateObj = map.get("orderDate");
        String orderDateStr = String.valueOf(orderDateObj);
        Date orderDate = new SimpleDateFormat("yyyy-MM-dd").parse(orderDateStr);
        //从map集合获取手机号
        Object telephoneObj = map.get("telephone");
        String telephone = String.valueOf(telephoneObj);

        //获取套餐的id
        Integer setmealId = Integer.parseInt(String.valueOf(map.get("setmealId")));

        // 1. 判断该日期是否可以预约
        //根据日期查询预约设置对象
        OrderSetting orderSetting =  orderSettingDao.findByOrderDate(orderDate);
        //如果没有预约设置对象，返回错误结果
        if(orderSetting == null){
            return new Result(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }

        //2. 判断是否预约已满
        //如果已预约人数大于等于可预约人数，预约已满，返回错误结果，否则，继续
        if(orderSetting.getReservations() >= orderSetting.getNumber()){
            return new Result(false, MessageConstant.ORDER_FULL);
        }
        //3. 判断是否是会员
        //根据手机号查询会员信息
        Member member = memberDao.findByTelephone(telephone);
        //如果没有会员信息-- 自动注册为会员
        if(member == null){
            //自动注册为会员: 注册会员必须回显id
            member = new Member();
            //给会员对象赋值
            //会员姓名
            member.setName(String.valueOf(map.get("name")));
            //会员性别
            member.setSex(String.valueOf(map.get("sex")));
            //会员身份证号码
            member.setIdCard(String.valueOf(map.get("idCard")));
            //会员手机号
            member.setPhoneNumber(telephone);
            //注册时间
            member.setRegTime(new Date());
            //添加会员
            memberDao.add(member);
        }
        //如果有会员信息 -- 判断是否重复复预约
        else{
            //判断是否重复复预约
            //判断该日期 该会员是否重复预约了某套餐
            //条件： 日期   会员   套餐
            Order order = new Order();
            order.setOrderDate(orderDate);
            order.setMemberId(member.getId());
            order.setSetmealId(setmealId);
            Order orderDb = orderDao.findByOrder(order);
            //orderDb： 判断对象是否为null，如果为null，没有预约，否则已经预约完成
            if(orderDb != null){
                return new Result(false, MessageConstant.HAS_ORDERED);
            }
        }

        //4. 添加预约信息
        Order order = new Order();
        //给预约设置数据
        //设置预约时间
        order.setOrderDate(orderDate);
        //设置会员id
        order.setMemberId(member.getId());
        //预约的类型
        order.setOrderType(String.valueOf(map.get("orderType")));
        //预约状态
        order.setOrderStatus(Order.ORDERSTATUS_NO);
        //套餐id
        order.setSetmealId(setmealId);
        //添加操作: 页面需要预约信息，需要主键 -- 回显
        orderDao.add(order);

        //5. 更新预约设置数据库: 指定日期已预约人数 加 1
        orderSetting.setReservations(orderSetting.getReservations() + 1);
        orderSettingDao.update(orderSetting);

        return  new Result(true,MessageConstant.ORDER_SUCCESS,order);
    }

    @Override
    public Map<String, Object> findById(Integer id) {
        return orderDao.findById(id);
    }
}
